Column

Bulletin 118 Subbasin

Groundwater Sustainability Agency

Public Water Systems

Column

Background

Motivation

Drought and the overexploitation of aquifers threatens the reliability of domestic water for millions of Californians. During the 2012-2016 drought thousands of domestic wells in Central Valley went dry, which drew national attention and federal intervention.


Questions

  1. How will a short (1-2 yr) or long (4-5 yr) drought affect domestic well failure in California?

  2. Are well failures more associated with particular social factors (i.e. - median income, ethnicity)? What policy implications does this have?

  3. Can machine learning models predict domestic well failure from climatological variables, and if so, what does climate change imply for domestic well vulnerability?


Donna Johnson, 70, (L) lifts pallets of donated bottled water from the back of her truck during her daily delivery run to residents whose wells have run dry, with resident Gabriel Tapia, 31, in Porterville, California October 14, 2014. Picture taken October 14, 2014. Photograph: Reuters/Lucy Nicholson

Data

DWR State Well Completion Reports

Domestic wells in California.


DWR Seasonal Groundwater Levels

Seasonal interpolated groundwater levels in Central Valley.


US Census Bureau ACS

% Difference from median household income by CA Census tract.

Model

Summary

The model is a physically driven model of well failure built in the open-source data science language R.

We start with the groundwater levels during the 2012-2016 drought and the position of domestic wells and their pumps. If the groundwater level falls below the level of the pump, the well goes dry.


Uncertainty

We quantify and propagate uncertainty in:

  • well failure reporting
  • OSWCR reporting
  • well retirement age
  • pump location
  • water level

Calibration/Validation

The model is calibrated to well failure reports during the 2012-2016 drought. This dataset is was privately obtained from the DWR upon request.

Conclusion

Future Directions

  • Improve model accuracy
  • Extend predictions to 1,2,4 year drought scenarios
  • Identify Community Water Systems nearest to well failures
    • environmental justice issues: is mean distance from wells to water systems correlated with poverty or ethnicity?
    • online tool for affected communities: what is my closest community water system?
  • Policy implications of domestic well failure
  • Apply machine learning models to predict impacts of climate change on domestic well vulnerability
  • Interactive Data Visualization and data API
    • 1-3 papers:
      • domestic well failure model
      • social dimensions of well failure and policy implications
      • machine learning and climate change forecasting
  • Github (code & data) will be released to public in early-October with the conclusion of the Water Data Challenge

Contact

  • Rich Pauloo (UC Davis): Hydrologist and Data Scientist
  • Alvar Escriva-Bou, PhD (Public Policy Institute of California): Adviser and Economist
  • Amanda Fencl (UC Davis): Social Scientist
  • Hervé Guillon, PhD (UC Davis): Data Scientist
  • Leo Qiu (UC Davis): Software Engineer
---
title: "Predicting Domestic Well Vulnerability to Drought"
output: 
  flexdashboard::flex_dashboard:
    source_code: embed
    social: menu
    theme: cerulean
---


```{r setup, include=FALSE}
library(flexdashboard)
library(sf)
library(sp)
library(readr)
library(colormap)
library(leaflet)
library(here)

# load data from`06_calibration_herve.Rmd`
b118cvsf      <- read_rds("b118cvsf.rds")
gsacvsf       <- read_rds("gsacvsf_simp.rds") # simplified by rmapshaper
domcv5ll_dry  <- read_rds("domcv5ll_dry.rds")
domcv5ll_wet  <- read_rds("domcv5ll_wet.rds")
icons_dry     <- read_rds("icons_dry.rds")
icons_wet     <- read_rds("icons_wet.rds")

# public water system boundaries
ws <- read_rds(here("data","public_water_systems","service_areas_in_cv_sf.rds"))
```

Column {data-width=700 .tabset}
-----------------------------------------------------------------------

### Bulletin 118 Subbasin

```{r}
pal <- colorBin(palette = colormap(colormaps$viridis, nshades = 5),
                domain = b118cvsf$frp, bins = seq(0,50,10))

pal2 <- colorBin(palette = colormap(colormaps$jet, nshades = 10),
                 domain = b118cvsf$dry, bins = seq(0,600,60))

pal3 <- colorBin(palette = colormap(colormaps$jet, nshades = 5),
                 domain = b118cvsf$dens_100km2, bins = seq(0,5,1))

b118cvsf %>% 
  leaflet(width = "100%") %>% 
  addProviderTiles(provider = "CartoDB.Positron") %>%
  addPolygons(label = ~ paste(as.character(Subbasin_N), fc),
              # polygons
              fillColor = ~ pal2(dry), 
              fillOpacity = 0.7, 
              smoothFactor = 1,
              group = "Dry Well Count",
              # lines
              stroke = TRUE, 
              color = "#323232", 
              opacity = 1, 
              weight = 1) %>% 
  addPolygons(label = ~ paste(as.character(Subbasin_N), round(dens_100km2),2),
              # polygons
              fillColor = ~ pal3(dens_100km2), 
              fillOpacity = 0.7, 
              smoothFactor = 1,
              group = "Dry Well Density",
              # lines
              stroke = TRUE, 
              color = "#323232", 
              opacity = 1, 
              weight = 1) %>% 
  addPolygons(label = ~ paste(as.character(Subbasin_N), fc),
              # polygons
              fillColor = ~ pal(frp), 
              fillOpacity = 0.7, 
              smoothFactor = 1,
              group = "Failure Ratio",
              # lines
              stroke = TRUE, 
              color = "#323232", 
              opacity = 1, 
              weight = 1) %>% 
  addAwesomeMarkers(lng = domcv5ll_dry@coords[, 1],
             lat = domcv5ll_dry@coords[, 2],
             popup = paste("Well ID:", domcv5ll_dry$WCRNumber,"
", "(", domcv5ll_dry$lon, "N", domcv5ll_dry$lat, "W)", "
", "Pump Location:", round(domcv5ll_dry$pump_loc,2), "ft.", "
", "Dry:", domcv5ll_dry$dry), icon = icons_dry, group = "Dry Wells", clusterOptions = markerClusterOptions()) %>% addAwesomeMarkers(lng = domcv5ll_wet@coords[, 1], lat = domcv5ll_wet@coords[, 2], popup = paste("Well ID:", domcv5ll_wet$WCRNumber,"
", "(", domcv5ll_wet$lon, "N", domcv5ll_wet$lat, "W)", "
", "Pump Location:", round(domcv5ll_wet$pump_loc,2), "ft.", "
", "Dry:", domcv5ll_wet$dry), icon = icons_wet, group = "Active Wells", clusterOptions = markerClusterOptions()) %>% addLegend("topright", pal = pal, values = ~ frp, opacity = 1, title = "% Failure", group = "Failure Ratio", labFormat = function(type, cuts, p) { n = length(cuts) paste0(cuts[-n], " – ", cuts[-1], "%") } ) %>% addLegend("bottomright", pal = pal2, values = ~ dry, opacity = 1, title = "Dry Well Count", group = "Dry Well Count", labFormat = function(type, cuts, p) { n = length(cuts) paste0(cuts[-n], " – ", cuts[-1]) } ) %>% addLegend("bottomleft", pal = pal3, values = ~ dens_100km2, opacity = 1, title = "Dry Well Density", group = "Dry Well Density", labFormat = function(type, cuts, p) { n = length(cuts) paste0(cuts[-n], " – ", cuts[-1], " per 100 sqkm.") } ) %>% addLayersControl(overlayGroups = c("Failure Ratio", "Dry Well Count", "Dry Well Density", "Dry Wells", "Active Wells"), position = "topleft", options = layersControlOptions(collapsed = FALSE)) %>% hideGroup(c("Dry Well Count","Dry Well Density","Dry Wells", "Active Wells")) %>% addEasyButton(easyButton( icon="fa-globe", title="Zoom to Level 7", onClick=JS("function(btn, map){ map.setZoom(7); }"))) %>% addEasyButton(easyButton( icon="fa-crosshairs", title="Locate Me", onClick=JS("function(btn, map){ map.locate({setView: true}); }"))) ``` ### Groundwater Sustainability Agency ```{r} pal <- colorBin(palette = colormap(colormaps$viridis, nshades = 5), domain = gsacvsf$frp, bins = seq(0,50,10)) pal2 <- colorBin(palette = colormap(colormaps$jet, nshades = 10), domain = gsacvsf$dry, bins = seq(0,350,35)) pal3 <- colorBin(palette = colormap(colormaps$jet, nshades = 5), domain = gsacvsf$dens_100km2, bins = seq(0,10,2)) gsacvsf %>% leaflet(width = "100%") %>% addProviderTiles(provider = "CartoDB.Positron") %>% addPolygons(label = ~ paste(as.character(GSA.Name), fc), # polygons fillColor = ~ pal2(dry), fillOpacity = 0.7, smoothFactor = 1, group = "Dry Well Count", # lines stroke = TRUE, color = "#323232", opacity = 1, weight = 1) %>% addPolygons(label = ~ paste(as.character(GSA.Name), round(dens_100km2),2), # polygons fillColor = ~ pal3(dens_100km2), fillOpacity = 0.7, smoothFactor = 1, group = "Dry Well Density", # lines stroke = TRUE, color = "#323232", opacity = 1, weight = 1) %>% addPolygons(label = ~ paste(as.character(GSA.Name), fc), # polygons fillColor = ~ pal(frp), fillOpacity = 0.7, smoothFactor = 1, group = "Failure Ratio", # lines stroke = TRUE, color = "#323232", opacity = 1, weight = 1) %>% addAwesomeMarkers(lng = domcv5ll_dry@coords[, 1], lat = domcv5ll_dry@coords[, 2], popup = paste("Well ID:", domcv5ll_dry$WCRNumber,"
", "(", domcv5ll_dry$lon, "N", domcv5ll_dry$lat, "W)", "
", "Pump Location:", round(domcv5ll_dry$pump_loc,2), "ft.", "
", "Dry:", domcv5ll_dry$dry), icon = icons_dry, group = "Dry Wells", clusterOptions = markerClusterOptions()) %>% addAwesomeMarkers(lng = domcv5ll_wet@coords[, 1], lat = domcv5ll_wet@coords[, 2], popup = paste("Well ID:", domcv5ll_wet$WCRNumber,"
", "(", domcv5ll_wet$lon, "N", domcv5ll_wet$lat, "W)", "
", "Pump Location:", round(domcv5ll_wet$pump_loc,2), "ft.", "
", "Dry:", domcv5ll_wet$dry), icon = icons_wet, group = "Active Wells", clusterOptions = markerClusterOptions()) %>% addLegend("topright", pal = pal, values = ~ frp, opacity = 1, title = "% Failure", group = "Failure Ratio", labFormat = function(type, cuts, p) { n = length(cuts) paste0(cuts[-n], " – ", cuts[-1], "%") } ) %>% addLegend("bottomright", pal = pal2, values = ~ dry, opacity = 1, title = "Dry Well Count", group = "Dry Well Count", labFormat = function(type, cuts, p) { n = length(cuts) paste0(cuts[-n], " – ", cuts[-1]) } ) %>% addLegend("bottomleft", pal = pal3, values = ~ dens_100km2, opacity = 1, title = "Dry Well Density", group = "Dry Well Density", labFormat = function(type, cuts, p) { n = length(cuts) paste0(cuts[-n], " – ", cuts[-1], " per 100 sqkm.") } ) %>% addLayersControl(overlayGroups = c("Failure Ratio", "Dry Well Count", "Dry Well Density", "Dry Wells", "Active Wells"), position = "topleft", options = layersControlOptions(collapsed = FALSE)) %>% hideGroup(c("Dry Well Count","Dry Well Density","Dry Wells", "Active Wells")) %>% addEasyButton(easyButton( icon="fa-globe", title="Zoom to Level 7", onClick=JS("function(btn, map){ map.setZoom(7); }"))) %>% addEasyButton(easyButton( icon="fa-crosshairs", title="Locate Me", onClick=JS("function(btn, map){ map.locate({setView: true}); }"))) ``` ### Public Water Systems ```{r} ws %>% leaflet(width = "100%") %>% addProviderTiles(provider = "CartoDB.Positron") %>% addPolygons(label = ~ name, smoothFactor = 1, stroke = TRUE, color = "#323232", opacity = 1, weight = 1) %>% addEasyButton(easyButton( icon="fa-globe", title="Zoom to Level 7", onClick=JS("function(btn, map){ map.setZoom(7); }"))) %>% addEasyButton(easyButton( icon="fa-crosshairs", title="Locate Me", onClick=JS("function(btn, map){ map.locate({setView: true}); }"))) ``` Column {data-width=300 .tabset .tabset-fade} ----------------------------------------------------------------------- ### Background #### Motivation Drought and the overexploitation of aquifers threatens the reliability of domestic water for millions of Californians. During the 2012-2016 drought thousands of domestic wells in Central Valley went dry, which drew national attention and federal intervention. *** #### Questions 1. How will a short (1-2 yr) or long (4-5 yr) drought affect domestic well failure in California? 2. Are well failures more associated with particular social factors (i.e. - median income, ethnicity)? What policy implications does this have? 3. Can machine learning models predict domestic well failure from climatological variables, and if so, what does climate change imply for domestic well vulnerability? *** ```{r, out.width = '100%'} knitr::include_graphics("F:/Box Sync/water_data_challenge/code/01_presentations/ca_water_data_summit/lucy_nicholson_reuters.jpg") ``` *Donna Johnson, 70, (L) lifts pallets of donated bottled water from the back of her truck during her daily delivery run to residents whose wells have run dry, with resident Gabriel Tapia, 31, in Porterville, California October 14, 2014. Picture taken October 14, 2014. Photograph: Reuters/Lucy Nicholson* ### Data #### DWR State Well Completion Reports ```{r, out.width = '100%'} knitr::include_graphics("F:/Box Sync/water_data_challenge/code/01_presentations/ca_water_data_summit/dom_wells.png") ``` *Domestic wells in California.* *** #### DWR Seasonal Groundwater Levels ```{r, out.width = '100%'} knitr::include_graphics("F:/Box Sync/water_data_challenge/code/01_presentations/ca_water_data_summit/sp_fall_viridis.gif") ``` *Seasonal interpolated groundwater levels in Central Valley.* *** #### US Census Bureau ACS ```{r, out.width = '100%'} knitr::include_graphics("F:/Box Sync/water_data_challenge/code/01_presentations/ca_water_data_summit/census.png") ``` *% Difference from median household income by CA Census tract.* ### Model #### Summary The model is a physically driven model of well failure built in the open-source data science language R. We start with the groundwater levels during the 2012-2016 drought and the position of domestic wells and their pumps. If the groundwater level falls below the level of the pump, the well goes dry. *** #### Uncertainty We quantify and propagate uncertainty in: * well failure reporting * OSWCR reporting * well retirement age * pump location * water level *** #### Calibration/Validation The model is calibrated to well failure reports during the 2012-2016 drought. This dataset is was privately obtained from the DWR upon request. ```{r, out.width = '100%'} knitr::include_graphics("F:/Box Sync/water_data_challenge/code/01_presentations/ca_water_data_summit/calib.png") ``` ### Conclusion #### Future Directions * Improve model accuracy * Extend predictions to 1,2,4 year drought scenarios * Identify Community Water Systems nearest to well failures + environmental justice issues: is mean distance from wells to water systems correlated with poverty or ethnicity? + online tool for affected communities: what is my closest community water system? * Policy implications of domestic well failure * Apply machine learning models to predict impacts of climate change on domestic well vulnerability * Interactive Data Visualization and data API + 1-3 papers: + domestic well failure model + social dimensions of well failure and policy implications + machine learning and climate change forecasting * Github (code & data) will be released to public in early-October with the conclusion of the Water Data Challenge *** #### Contact * **Rich Pauloo** (UC Davis): Hydrologist and Data Scientist * **Alvar Escriva-Bou, PhD** (Public Policy Institute of California): Adviser and Economist * **Amanda Fencl** (UC Davis): Social Scientist * **Hervé Guillon, PhD** (UC Davis): Data Scientist * **Leo Qiu** (UC Davis): Software Engineer